package zifuchuan

func ReverseWords(s string) string {
	// 去除前面的多余空格，去除词间多余空格，去除尾部空格，使用双指针法
	n := len(s)
	b := []byte(s)
	slow, fast := 0, 0
	// 首先，删除头部
	for fast < n && b[fast] == ' ' {
		fast++
	}
	// 现在是fast到达第一个字母，slow还在首位置，开始移动fast，去除词间多余空格
	for ; fast < n; fast++ {
		if fast > 1 && b[fast] == b[fast-1] && b[fast] == ' ' {
			// 多余空格
			continue
		}
		b[slow] = b[fast]
		slow++
	}
	// 去除尾部多余空格
	if slow-1 > 0 && b[slow-1] == ' ' {
		b = b[:slow-1]
	} else {
		b = b[:slow]
	}
	// 是值传递，但是直接修改的是指针，底层数组被间接修改了
	Reverse(b)
	// 对内部字符进行修改
	slow, fast = 0, 0
	n = len(b)
	for fast < n {
		if b[fast] == ' ' {
			Reverse(b[slow:fast])
			slow = fast
			slow += 1
		}
		fast++
	}
	Reverse(b[slow:fast])
	return string(b)
}

func Reverse(b []byte) {
	left, right := 0, len(b)-1
	for left < right {
		b[left], b[right] = b[right], b[left]
		left++
		right--
	}
}
